# 带着二哈去旅行丶:ZZQ
# 生成时间：2021/12/4 下午4:19

# 15.4 使用Plotly模拟掷骰子.3.1
# 随机漫步路径：每次行走都是完全随机的、没有明确方向，结果是由一些列随机决策决定的。
# 创建RandomWalk类，随机选择前景方向。三个属性：一个存储随机漫步次数的变量，其他两个列表，分别存储x，y坐标

from random import choice


class RandomWalk:
    # 一个随机生成漫步数据的类
    def __init__(self, num_points=5000):  # 初始化随机漫步默认的点数的属性
        self.num_points = num_points

        # 所有随机漫步都始于（0，0）
        self.x_values = [0]
        self.y_values = [0]

    def get_step(self):
        # 决定前进方向以及沿着这个方向前进的距离
        direction = choice([1, -1])  # 选择结果要么表示向右走的1 要么向左走的-1
        distance = choice([0, 1, 2, 3, 4, 5])  # 选择向指定方向走多远
        # y_direction = choice([1, -1])
        # y_distance = choice([0, 1, 2, 3, 4, 5])
        return direction * distance  # 确定移动距离 x_step为正向右移 为负向左移 为0垂直移 y_step为正向上 为负向下 为0水平

    # 15.4 使用Plotly模拟掷骰子.3.2
    # 利用方法fill_walk()来生成漫步包含的点并决定每次漫步的方向
    def fill_walk(self):
        # 计算随机漫步包含的所有点
        while len(self.x_values) < self.num_points:  # 截止到漫步包含的随机点数

            x_step = self.get_step()
            y_step = self.get_step()
            # 拒绝原地踏步
            if x_step == 0 and y_step == 0:
                continue
            # 计算下一个点的x和y值
            x = self.x_values[-1] + x_step  # 将x_step与x_values中最后一个值相加
            y = self.y_values[-1] + y_step

            self.x_values.append(x)  # 添加在末尾一个元素
            self.y_values.append(y)
